package Spark高级特性.广播变量;

import org.apache.spark.{SparkConf, SparkContext}
import org.junit.Test

class broadCast {

  val conf = new SparkConf().setMaster("local[6]").setAppName("bc")
  val sc   = new SparkContext(conf)

  /**
   *  假设有10个Task，将会复制10份kv
   */
  @Test
  def bc1(): Unit ={

    // 数据
    val kv = Map("Spark"-> "http://spark.apache.cn","Scala"->"http://www.scala-lang.org")
    val r  = sc.parallelize(Seq("Spark","Scala"))

    // 将其中的Spark 和Scala 转为对应的网址
    val result = r.map( item => kv(item)).collect()

    println(result)

    sc.stop()

  }

  /**
   *  使用广播
   */
  @Test
  def bc2(): Unit ={

    // 数据
    val kv = Map("Spark"-> "http://spark.apache.cn","Scala"->"http://www.scala-lang.org")
    val r  = sc.parallelize(Seq("Spark","Scala"))

    // 创建广播
    val bc = sc.broadcast(kv)

    // 将其中的Spark 和Scala 转为对应的网址
    // 在算子中使用广播变量代替直接引用集合，只会复制和Executor一样数量的value
    val result = r.map( item => bc.value(item)).collect()

    result.foreach(println(_))

    sc.stop()


  }

}
